package com.weeho.servlet.utils;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESUtil  {
        private static String PASSWORD = "ncme@zx&*";
        public static  byte[]  encrypt(String content) {   
        try {        
           //KeyGenerator提供（对称）密钥生成器的功能。使用getInstance 类方法构造密钥生成器。
           KeyGenerator kgen = KeyGenerator.getInstance("AES");
           //使用用户提供的随机源初始化此密钥生成器，使其具有确定的密钥大小。
           kgen.init(128, new SecureRandom(PASSWORD.getBytes()));
           SecretKey secretKey = kgen.generateKey();   
          byte[] enCodeFormat = secretKey.getEncoded(); 
          //使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,，而无须通过一个（基于 provider 的）SecretKeyFactory.
          SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
          Cipher cipher = Cipher.getInstance("AES");
          // 创建密码器   //为创建 Cipher 对象，应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称（可选）。
           byte[] byteContent = content.getBytes("utf-8");  
           cipher.init(Cipher.ENCRYPT_MODE, key);
                // 初始化   
           byte[] result = cipher.doFinal(byteContent); 
           //按单部分操作加密或解密数据，或者结束一个多部分操作。数据将被加密或解密（具体取决于此 Cipher 的初始化方式）。
           return result;
        } catch (NoSuchAlgorithmException e) {   
                e.printStackTrace();   
        } catch (NoSuchPaddingException e) {  
                e.printStackTrace();   
        } catch (InvalidKeyException e) {  
                e.printStackTrace();   
        } catch (UnsupportedEncodingException e) {   
                e.printStackTrace();   
        } catch (IllegalBlockSizeException e) { 
                e.printStackTrace();   
        } catch (BadPaddingException e) {  
                e.printStackTrace();   
        }   
        return null;   
        } 
        
        
        public static byte[] decrypt(byte[] content) {   
	        try {
	            KeyGenerator kgen = KeyGenerator.getInstance("AES");  
	            kgen.init(128, new SecureRandom(PASSWORD.getBytes()));   
	            SecretKey secretKey = kgen.generateKey(); 
	            byte[] enCodeFormat = secretKey.getEncoded();   
	            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
	            Cipher cipher = Cipher.getInstance("AES");// 创建密码器  
	            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
	            byte[] result = cipher.doFinal(content); 
	            return result; // 加密
	        } catch (NoSuchAlgorithmException e) {  
	            e.printStackTrace();   
	        } catch (NoSuchPaddingException e) {  
	            e.printStackTrace(); 
	        } catch (InvalidKeyException e) {   
	            e.printStackTrace();
	        } catch (IllegalBlockSizeException e) { 
	                e.printStackTrace();   
	        } catch (BadPaddingException e) { 
	                e.printStackTrace(); 
	        }   
	        return null;   
	        }
			
        /**将二进制转换成16进制 / 
         * @param buf 
         * @return 
         */  
        public static String parseByte2HexStr(byte buf[]) {
                StringBuffer sb = new StringBuffer(); 
                for (int i = 0; i < buf.length; i++) { 
                        String hex = Integer.toHexString(buf[i] & 0xFF);
                        if (hex.length() == 1) {
                                hex = '0' + hex;  
                        } 
                        sb.append(hex.toUpperCase());
                }  
                return sb.toString();
        }  
		
        /**将16进制转换为二进制 
         * @param hexStr
         * @return 
        */  
        public static byte[] parseHexStr2Byte(String hexStr) {  
                if (hexStr.length() < 1)  
                        return null;  
                byte[] result = new byte[hexStr.length()/2];  
                for (int i = 0;i< hexStr.length()/2; i++) { 
                        int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
                        int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  
                        result[i] = (byte) (high * 16 + low); 
                }  
                return result; 
        }  
		
        //测试
        public static void main(String[] args) {
            String content = "test001";  
                //加密   
                System.out.println("加密前：" + content);
                byte[] encryptResult = encrypt(content);  
                String encryptResultStr = parseByte2HexStr(encryptResult); 
                System.out.println("加密后：" + encryptResultStr); 
                byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);  
                byte[] decryptResult = decrypt(decryptFrom);  
                System.out.println("解密后：" + new String(decryptResult));  
        }
}